#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

pthread_t t1, t2, t3, t4;
// return退出，不管退出码
void *Routine1(void *asg)
{
    printf("%s....quit\n", (char *)asg);
    return NULL;
}
// return退出，管退出码
void *Routine2(void *asg)
{

    printf("%s....quit\n", (char *)asg);
    return (void *)1;
}
// 调用pthread_exit来退出
void *Routine3(void *asg)
{
    printf("%s....quit\n", (char *)asg);
    pthread_exit((void *)2);
}
// 调用 pthread_cancel来取消自己，这个函数的用法一般不是来取消自己的，而是取消别的线程的。
void *Routine4(void *asg)
{
    printf("%s....quit\n", (char *)asg);
    pthread_cancel(t4);
    return NULL;
}

int main()
{
    // 创建线程
    pthread_create(&t1, NULL, Routine1, (void *)"thread 1");
    pthread_create(&t2, NULL, Routine2, (void *)"thread 2");
    pthread_create(&t3, NULL, Routine3, (void *)"thread 3");
    pthread_create(&t4, NULL, Routine4, (void *)"thread 4");

    void *ret1 = NULL;
    void *ret2 = NULL;
    void *ret3 = NULL;
    void *ret4 = NULL;

    // 线程等待
    pthread_join(t1, &ret1);
    pthread_join(t2, &ret2);
    pthread_join(t3, &ret3);
    pthread_join(t4, &ret4);

    // 打印线程退出时的退出码
    printf("thread return, thread id %lu, return code:%d\n", t1, *(int *)&ret1);
    printf("thread return, thread id %lu, return code:%d\n", t2, *(int *)&ret2);
    printf("thread return, thread id %lu, return code:%d\n", t3, *(int *)&ret3);
    printf("thread return, thread id %lu, return code:%d\n", t4, *(int *)&ret4);

    return 0;
}

// void *Routine(void *asg)
// {
//     pthread_t ret = pthread_self();
//     while (1)
//     {
//         printf("----id:%lu-----\n", ret);
//         printf("----id:%p-----\n", ret);
//         sleep(1);
//     }
//     return NULL;
// }

// int main()
// {
//     pthread_t t1;
//     pthread_create(&t1, NULL, Routine, NULL);
//     while (1)
//         ;
//     return 0;
// }

// void *Routine(void *buf)
// {
//     while (1)
//     {
//         printf("%s:---->pid:%d---\n", (char *)buf, getpid());
//         sleep(1);
//     }
//     return NULL;
// }
// int main()
// {
//     pthread_t t1;
//     pthread_create(&t1, NULL, Routine, (void *)"establish succeed");
//     while (1)
//     {
//         printf("--->pid:%d<----\n", getpid());
//         sleep(1);
//     }
//     return 0;
// }

// void *Routine(void *buf)
// {
//     printf("%s\n", (char *)buf);
//     return NULL;
// }

// int main()
// {
//     // 创建线程t1
//     pthread_t t1;
//     int result = pthread_create(&t1, NULL, Routine, (void *)"establish succeed");
//     if (result != 0)
//     {
//         fprintf(stderr, "线程创建失败: %d\n", result);
//         return 1;
//     }

//     // 等待线程t1完成
//     pthread_join(t1, NULL);

//     return 0;
// }